// 魔术师发牌问题
/* 魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前，魔术师已经将他们依照一定的顺序叠放好（有花色的一面朝下）。
魔术表演过程为：一开始，魔术师数1，然后把最上面的那张牌翻过来，是黑桃A；然后将其放到桌面上；
第二次,魔术师数1、2；将第一张牌放到这些牌的最以下，将第二张牌翻转过来，正好是黑桃2；
第三次，魔术师数1、2、3；将第1、2张牌依次放到这些牌的最以下，将第三张牌翻过来正好是黑桃3；
以此类推，直到将全部的牌都翻出来为止。问原来牌的顺序是怎样的 */
const { CirSingleList } = require("../CirSingleList");
let magicList = new CirSingleList();

function magician() {
  let arr = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

  for (let i = 0; i < 13; i++) {
    magicList.append(""); // 单向循环链表的每项节点值为空
  }

  let n = 1;
  let toColor = undefined;

  while (n <= 13) {
    let forward = n; // 记录此次循环需要的次数

    while (forward != 0) {
      toColor = magicList.advance(1, toColor); // 前进一个节点

      if (!toColor.element) {
        forward--; // 在节点值为空的时候forward减1，就可以继续前进一步
      }
    }

    toColor.element = arr[n - 1];
    n++;
  }

  magicList.display();
}

magician();
